#!/usr/bin/python
#
#  哥德巴赫猜想：任一大于2的偶数，都可表示成两个素数之和。
#

# 计算用户输入的数字范围内的所有质数和所有大于2的偶数
def get_even_number_and_prime_number(a: int):
    os = [] # 大于2的偶数集合
    zs = [2, 3, 5, 7] # 质数集合

    for i in range(a + 1):
        # 求偶数
        if i > 2 and i % 2 == 0:
            os.append(i)

        # 求质数
        # 这个算法求小质数可以，但数字大了可能就不对了，
        # 比如: 11 * 13, 不能被2,3,5,7整除，但它是偶数
        if i > 10:
            if i % 2 != 0 and i % 5 != 0 and i % 3 != 0 and i % 7 != 0:
                zs.append(i)

    return (os, zs)

# 穷举法: 把所有质数两两相加，相加结果保存到字典里，自己也和自己相加
# 返回结果: {相加结果值: 相加表达式}
def add_prime_number(zs: list):
    he = {}
    count = len(zs)
    for index in range(count):
        p1 = zs[index]
        for p2 in zs[index:]:
            he[p1 + p2] = '%d+%d' % (p1, p2)
    return he

# 验证哥德巴赫的猜想
# 把一个个偶数，与质数相加值一一对比，看是否命中，命中则哥德巴赫的猜想成立
# 返回值：
#   true--命中的质数相加值和表达式，
#   false--没有命中的偶数，即不能被两个质数相加的偶数
def verify_goldback(os: list, he: dict):
    true = {}
    false = []

    for i in os:
        if i in he.keys():
            true[i] = he[i]
        else:
            false.append(i)

    return (true, false)

# 执行猜想
def conjecture(a: int):
    # 用户输入的数字范围内的所有质数和所有大于2的偶数！！！
    os, zs = get_even_number_and_prime_number(a)

    # 穷举法: 把所有质数两两相加，相加结果保存到字典里，自己也和自己相加
    he = add_prime_number(zs)

    # 验证哥德巴赫的猜想！！！
    true, false = verify_goldback(os, he)

    print('在哥德巴赫的猜想内的大于2的偶数有：' + str(true))
    if len(false) == 0:
        print('在您输入的数字范围内哥德巴赫的猜想成立！！！！！')
    else:
        print('不在哥德巴赫的猜想内的大于2的偶数有：' + str(false))

def main():
    a = int(input('欢迎来到‘哥德巴赫的猜想’！请输入您想证实的数字范围！！！:'))
    conjecture(a)

if __name__ == "__main__":
    main()